package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Contato;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe ContatoDAO, extende a classe DAOGenerico para obeter 
 * recursos de conexão e excução de consultas e comandos.
 * 
 * Responsável por gerenciar acesso ao banco de dados relacionados a 
 * Entidade Contato.
 * 
 * @author Daniel
 * 
 */
public class ContatoDAO extends DAOGenerico{
    
    /**
     * Método para inserir um contato.
     * 
     * @param contato Objeto contato a ser inserido.
     * 
     * @return boolean indica se o método foi executado com sucesso.
     * 
     **/
    
    public boolean inserir(Contato contato){
     
        contato.setId(getNextId("contatos"));
        
        return executarComando("INSERT INTO contatos (id,telefone, celular, fax, email) "
                             + "VALUES (?,?,?,?,?)"
                             , contato.getId()
                             , contato.getTelefone(), contato.getCelular()
                             , contato.getFax(), contato.getEmail());
        
    }
    
    /**
     * Método para atualizar informações de um contato.
     * 
     * @param contato Objeto contato a ser atualizado.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean atualizar(Contato contato){
     
        return executarComando("UPDATE contatos SET telefone = ?, celular = ?, "
                             + "fax = ?, email = ? WHERE id = ?"
                             , contato.getTelefone(), contato.getCelular()
                             , contato.getFax(), contato.getEmail(), contato.getId());
        
    }
    
    /**
     * Método para excluir um contato.
     * 
     * @param contato Objeto contato a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(Contato contato){
    
        return executarComando("DELETE FROM contatos WHERE id = ?", contato.getId());
        
    }
    
    /**
     * Método para excluir um contato.
     * 
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     * 
     **/
    
    public boolean excluir(int id){
    
        return executarComando("DELETE FROM contatos WHERE id = ?", id);
        
    }
    
    /**
     * Método para buscar o contato pelo ID
     * 
     * @return Contato correspondente ai ID, se não for encontrado retorna null.
     * 
     * @param id inteiro que representa o ID do contato na tabela
     * 
     **/
    
    public Contato getById(int id){
    
        ResultSet rs = executarConsulta("SELECT * FROM contatos WHERE id = ?", id);
        
        Contato contato = null;
        
        try {
            
            if(rs.next()){
                
                contato = polularInformacoes(rs);
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO BUSCAR CONTATO POR ID");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
        
        return contato;
        
    }
    
    /**
     * Método para listagem de contatos.
     * 
     * @return Retorna uma lista de contatos com o resultado da consulta
     * 
     **/
    
    public List<Contato> listar(){
    
        List<Contato> contatos = new ArrayList<>();
        
        ResultSet rs = executarConsulta("SELECT * FROM contatos");
        
        try {
            
            while(rs.next()){
                
                contatos.add(polularInformacoes(rs));
                
            }
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PERCORER RESULT_SET");
            
        }finally{
            
            try {
                
                rs.close();
                connection.close();
                
            } catch (SQLException ex) {
                
                
                
            }
            
        }
            
        return contatos;
        
    }
    
    /**
     * Método para preencher informações de um contato com resultados do 
     * banco de dados.
     * 
     * @param rs ResultSet com o resultado de uma consulta SQL
     * 
     * @return Retorna um contato populado com informações vindas do banco de 
     *  dados
     * 
     **/
    
    public Contato polularInformacoes(ResultSet rs){
    
        Contato contato = new Contato();
        
        try {
            
            contato.setId(rs.getInt("id"));
            contato.setTelefone(rs.getString("telefone"));
            contato.setCelular(rs.getString("celular"));
            contato.setFax(rs.getString("fax"));
            contato.setEmail(rs.getString("email"));
            
        } catch (SQLException ex) {
            
            System.err.println("ERRO AO PULULAR CONTATO");
            
        }
        
        return contato;
        
    }
    
}
